'''
  支持多人聊天和可以进入不同的房间
  第二题可以使用多线程来实现一个服务端和多个客户端发送消息
  思路：使用多线程创建多个服务端，然后每个服务端被客户端连接上时都会创建一个线程来执行
'''

import socket
import threading
import chat_pb2


# 处理客户端的消息
def handle_client(port_number, client_socket):  # 服务端的端口号、客户端socket
    while True:
        data = client_socket.recv(1024 * 5)
        if not data:
            break
        # 解析消息
        message = chat_pb2.ChatMessage()
        message.ParseFromString(data)
        print(f'{message.name}在{port_number}发言: {message.message}')
    client_socket.close()


# 运行服务端  参数是绑定的端口号
def run_server(port_number):
    # 创建TCP传输套接字，绑定主机端口，监听8个端口
    server_socker = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socker.bind(('127.0.0.1', port_number))
    server_socker.listen(8)

    print(f'\n127.0.0.1:{port_number}聊天室已经启动。等待连接...')
    while True:
        client_socket, address = server_socker.accept()  # 接受并等待客户端连接
        # 解析出名字
        data = client_socket.recv(1024 * 5)
        if not data:
            break
        message = chat_pb2.ChatMessage()
        message.ParseFromString(data)
        print(f'欢迎{message.name}来到{port_number}聊天室')
        # 为每个客户端连接创建一个线程来处理
        client_thread = threading.Thread(target=handle_client, args=(port_number, client_socket))
        client_thread.start()


if __name__ == '__main__':
    # 创建3个服务端聊天室并启动等待连接
    t1 = threading.Thread(target=run_server, args=(11111,))
    t2 = threading.Thread(target=run_server, args=(22222,))
    t3 = threading.Thread(target=run_server, args=(33333,))
    t1.start()
    t2.start()
    t3.start()











